home *** CD-ROM | disk | FTP | other *** search
- SYSTEM fractal;
- CONST maxlevel = 7;
- (* specification of binary tree-structure *)
- CONFIGURATION tree [1..2**maxlevel -1];
- CONNECTION son_l : tree[i] -> tree[2*i].father;
- son_r : tree[i] -> tree[2*i+1].father;
- father: tree[i] -> {even(i)} tree[i div 2].son_l,
- {odd(i)} tree[i div 2].son_r;
- SCALAR i,j : integer;
- delta : real;
- field : ARRAY [1..2**maxlevel-1] OF real;
- VECTOR x, low, high: real;
-
- PROCEDURE Gauss(): VECTOR real;
- (* random number with Gaussian distribution *)
- CONST N = 4;
- A = MAX(integer);
- GA= (3.0*float(N))**0.5;
- GF= 2.0*GA / (float(N)*float(A));
- SCALAR i : integer;
- VECTOR sum: real;
- BEGIN
- sum:=0.0;
- FOR i:=1 to N DO sum:= sum + float(VIRandom()) END;
- RETURN (GF*sum - GA)
- END Gauss;
-
- PROCEDURE inorder(SCALAR node: integer);
- CONST maxnode = 2 ** maxlevel -1;
- BEGIN
- IF node <= maxnode THEN
- inorder(2*node);
- WriteFixPt(field[node], 10,3);
- WriteLn;
- inorder(2*node+1);
- END
- END inorder;
-
- PROCEDURE MidPointRec(SCALAR delta: real; SCALAR level: integer);
- SCALAR min, max, max2 : integer;
- BEGIN
- (* select tree-level: 2**(level-1) <= id_no <= 2**level - 1 *)
- min := 2**(level-1);
- max := 2 * min - 1;
- max2:= 2 * max + 1;
-
- PARALLEL
- IF min <= id_no <= max THEN
- x := 0.5 * (low + high) + delta*Gauss();
- END;
-
- (* select the current and the next tree-level for data propagation *)
- IF min <= id_no <= max2 THEN
- (* new values for low and high at right and left son, respectively *)
- propagate.son_l(low);
- propagate.son_r(high);
- propagate.son_l(x);
- propagate.son_r(x);
- IF even(id_no) THEN high:=x ELSE low:=x END;
- END
- ENDPARALLEL
- END MidPointRec;
-
-
- BEGIN (* main *)
- PARALLEL (* [1] *) (* only the root is active *)
- low := 0.0; (* starting value *)
- high := 1.0;
- x := 0.0;
- ENDPARALLEL;
- FOR i:=1 TO maxlevel DO
- delta := 0.5 ** (float(i+1)/2.0);
- MidPointRec(delta,i);
- END; (* for *)
- store(x,field);
- inorder(1);
- END fractal.
-
-